/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ufpr.ees.suhck.controller;

import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import ufpr.ees.suhck.dao.planosaude.PlanoSaudeDao;
import ufpr.ees.suhck.dao.planosaude.PlanoSaudeDaoImpl;
import ufpr.ees.suhck.dao.agendamento.AgendamentoDao;
import ufpr.ees.suhck.dao.agendamento.AgendamentoDaoImpl;
import ufpr.ees.suhck.dao.atendimento.AtendimentoDao;
import ufpr.ees.suhck.dao.atendimento.AtendimentoDaoImpl;
import ufpr.ees.suhck.dao.paciente.PacienteDao;
import ufpr.ees.suhck.dao.paciente.PacienteDaoImpl;
import ufpr.ees.suhck.dao.pacienteplano.PacientePlanoDao;
import ufpr.ees.suhck.dao.pacienteplano.PacientePlanoDaoImpl;
import ufpr.ees.suhck.dao.usuario.AtendenteDao;
import ufpr.ees.suhck.dao.usuario.AtendenteDaoImpl;
import ufpr.ees.suhck.dao.usuario.GerenteDao;
import ufpr.ees.suhck.dao.usuario.GerenteDaoImpl;
import ufpr.ees.suhck.dao.usuario.MedicoDao;
import ufpr.ees.suhck.dao.usuario.MedicoDaoImpl;
import ufpr.ees.suhck.model.Agendamento;
import ufpr.ees.suhck.model.Atendente;
import ufpr.ees.suhck.model.Atendimento;
import ufpr.ees.suhck.model.EstadoPaciente;
import ufpr.ees.suhck.model.Gerente;
import ufpr.ees.suhck.model.Medico;
import ufpr.ees.suhck.model.PlanoSaude;
import ufpr.ees.suhck.model.Paciente;
import ufpr.ees.suhck.model.PacientePlano;
import ufpr.ees.suhck.model.SituacaoAtendimento;
import ufpr.ees.suhck.model.Usuario;
import ufpr.ees.suhck.util.MD5;

@WebServlet(name = "Front", urlPatterns = {"/Front"})
public class Front extends HttpServlet {

    private HttpServletRequest request;
    private HttpServletResponse response;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        this.request = request;
        this.response = response;
        String action = request.getParameter("action");

        if ("login".equals(action)) {
            loginAction();
        } else if ("logout".equals(action)) {
            logoutAction();
        } else if ("atualizarPainel".equals(action)) {
            atualizarPainelAction();
        } else if (request.getSession().getAttribute("usuario") == null) {
            dispatchTo("/login.jsp");
        } else if (request.getSession().getAttribute("tipo").equals("medico")) {
            if ("atenderProximoPaciente".equals(action)) {
                atenderProximoPacienteAction();
            } else if ("finalizarAtendimento".equals(action)) {
                finalizarAtendimentoAction();
            } else {
                dispatchTo("/InicioMedico.jsp");
            }
        } else if (request.getSession().getAttribute("tipo").equals("atendente")) {
            if ("inserirAgendamento".equals(action)) {
                inserirAgendamentoAction();
            } else if ("inserirAgendamentoPage".equals(action)) {
                inserirAgendamentoPageAction();
            } else if ("alterarAgendamento".equals(action)) {
                alterarAgendamentoAction();
            } else if ("listarAgendamento".equals(action)) {
                listarAgendamentoAction();
            } else if ("buscarAgendamento".equals(action)) {
                buscarAgendamentoAction();
            } else if ("buscarAgendamentoPorPaciente".equals(action)) {
                buscarAgendamentoPorPacienteAction();
            } else if ("buscarAgendamentoPorData".equals(action)) {
                buscarAgendamentoPorDataAction();
            } else if ("consultarAgendamento".equals(action)) {
                consultarAgendamentoAction();
            } else if ("removerAgendamento".equals(action)) {
                removerAgendamentoAction();
            } else if ("inserirPaciente".equals(action)) {
                inserirPacienteAction();
            } else if ("alterarPaciente".equals(action)) {
                alterarPacienteAction();
            } else if ("listarPaciente".equals(action)) {
                listarPacienteAction();
            } else if ("buscarPaciente".equals(action)) {
                buscarPacienteAction();
            } else if ("buscarPacientePorNome".equals(action)) {
                buscarPacientePorNomeAction();
            } else if ("buscarPacientePorCpf".equals(action)) {
                buscarPacientePorCpfAction();
            } else if ("removerPaciente".equals(action)) {
                removerPacienteAction();
            } else {
                dispatchTo("/InicioAtendente.jsp");
            }
        } else if (request.getSession().getAttribute("tipo").equals("gerente")) {
            if ("inserirAtendente".equals(action)) {
                inserirAtendenteAction();
            } else if ("alterarAtendente".equals(action)) {
                alterarAtendenteAction();
            } else if ("listarAtendente".equals(action)) {
                listarAtendenteAction();
            } else if ("buscarAtendente".equals(action)) {
                buscarAtendenteAction();
            } else if ("buscarAtendentePorNome".equals(action)) {
                buscarAtendentePorNomeAction();
            } else if ("buscarAtendentePorCpf".equals(action)) {
                buscarAtendentePorCpfAction();
            } else if ("removerAtendente".equals(action)) {
                removerAtendenteAction();
            } else if ("inserirMedico".equals(action)) {
                inserirMedicoAction();
            } else if ("alterarMedico".equals(action)) {
                alterarMedicoAction();
            } else if ("listarMedico".equals(action)) {
                listarMedicoAction();
            } else if ("buscarMedico".equals(action)) {
                buscarMedicoAction();
            } else if ("buscarMedicoPorEsp".equals(action)) {
                buscarMedicoPorEspAction();
            } else if ("buscarMedicoPorCrm".equals(action)) {
                buscarMedicoPorCrmAction();
            } else if ("removerMedico".equals(action)) {
                removerMedicoAction();
            } else if ("inserirPlano".equals(action)) {
                inserirPlanoAction();
            } else if ("alterarPlano".equals(action)) {
                alterarPlanoAction();
            } else if ("listarPlano".equals(action)) {
                listarPlanoAction();
            } else if ("buscarPlano".equals(action)) {
                buscarPlanoAction();
            } else if ("buscarPlanoPorCnpj".equals(action)) {
                buscarPlanoPorCnpj();
            } else if ("removerPlano".equals(action)) {
                removerPlanoAction();
            } else {
                dispatchTo("/InicioGerente.jsp");
            }
        } else {
            dispatchTo("/login.jsp");
        }

    }


    private void loginAction() throws ServletException, IOException {
        String email = request.getParameter("email");
        String senha = request.getParameter("senha");
        Usuario usuario = login(email, senha);
        if (usuario == null) {
            dispatchTo("/login.jsp");
        }

        request.getSession().setAttribute("usuario", usuario);
        if (usuario instanceof Gerente) {
            request.getSession().setAttribute("tipo", "gerente");
            dispatchTo("/InicioGerente.jsp");
        } else if (usuario instanceof Medico) {
            request.getSession().setAttribute("tipo", "medico");
            dispatchTo("/InicioMedico.jsp");
        } else if (usuario instanceof Atendente) {
            request.getSession().setAttribute("tipo", "atendente");
            dispatchTo("/InicioAtendente.jsp");
        }

    }

    private Usuario login(String email, String senha) {
        MedicoDao medicoDao = new MedicoDaoImpl();
        Usuario usuario = medicoDao.findPorEmail(email);
        if (usuario == null) {
            AtendenteDao atendenteDao = new AtendenteDaoImpl();
            usuario = atendenteDao.findPorEmail(email);
            if (usuario == null) {
                GerenteDao gerenteDao = new GerenteDaoImpl();
                usuario = gerenteDao.findPorEmail(email);
                if (usuario == null) {
                    return null;
                }
            }
        }
        String senhaMd5 = MD5.getMD5(senha);
        if (!usuario.getSenha().equals(senhaMd5)) {
            return null;
        }
        return usuario;
    }

    private void logoutAction() throws ServletException, IOException {
        request.getSession().removeAttribute("usuario");
        request.getSession().removeAttribute("tipo");
        dispatchTo("/login.jsp");
    }

    private void dispatchTo(String url) throws ServletException, IOException {
        RequestDispatcher rd = getServletContext().getRequestDispatcher(url);
        rd.forward(request, response);
    }

    @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    private void inserirAgendamentoPageAction() throws ServletException, IOException {
        PacienteDao pacienteDao = new PacienteDaoImpl();
        List<Paciente> pacientes = pacienteDao.findAll();
        request.setAttribute("pacientes", pacientes);
        dispatchTo("/InserirAgendamento.jsp");
    }

    private void inserirAgendamentoAction() throws ServletException, IOException {
        Long idPaciente = Long.parseLong(request.getParameter("paciente"));
        Paciente paciente = new Paciente();
        paciente.setId(idPaciente);
        String anamnese = request.getParameter("anamnese");
        Atendente atendente = (Atendente) request.getSession().getAttribute("usuario");
        Date dataAgendamento = new Date();
        EstadoPaciente estadoPaciente = obterEstadoPaciente(request.getParameter("estado_paciente"));
        SituacaoAtendimento situacaoAtendimento = SituacaoAtendimento.ESPERA;

        Agendamento agendamento = new Agendamento();
        agendamento.setPaciente(paciente);
        agendamento.setAnamnese(anamnese);
        agendamento.setAtendente(atendente);
        agendamento.setDataAgendamento(dataAgendamento);
        agendamento.setEstadoPaciente(estadoPaciente);
        agendamento.setSituacao(situacaoAtendimento);

        AgendamentoDao agendamentoDao = new AgendamentoDaoImpl();
        agendamentoDao.save(agendamento);

        if (agendamento.getId() == null) {
            request.setAttribute("erro", "1");
            inserirAgendamentoPageAction();
        } else {
            listarAgendamentoAction();
        }
    }

    private EstadoPaciente obterEstadoPaciente(String estadoPaciente) {
        return EstadoPaciente.valueOf(estadoPaciente);
    }

    private SituacaoAtendimento obterSituacaoAtendimento(String situacaoAtendimento) {
        SituacaoAtendimento situacao = SituacaoAtendimento.valueOf(situacaoAtendimento);
        return situacao;
    }

    private void listarAgendamentoAction() throws ServletException, IOException {
        List<Agendamento> agendamentos = listarAgendamentos();
        request.setAttribute("agendamentos", agendamentos);
        dispatchTo("/ListarAgendamento.jsp");
    }

    private List<Agendamento> listarAgendamentos() {
        AgendamentoDao dao = new AgendamentoDaoImpl();
        List<Agendamento> agendamentos = dao.findAll();
        return agendamentos;
    }

    private void alterarAgendamentoAction() throws ServletException, IOException {
        Long id = Long.parseLong(request.getParameter("idagendamento"));
        Long idPaciente = Long.parseLong(request.getParameter("paciente"));
        Paciente paciente = new Paciente();
        paciente.setId(idPaciente);
        String data = request.getParameter("data");
        String anamnese = request.getParameter("anamnese");
        Atendente atendente = (Atendente) request.getSession().getAttribute("usuario");

        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date dataAgendamento = null;
        try {
            dataAgendamento = format.parse(data);
        



} catch (ParseException ex) {
            Logger.getLogger(Front.class  

.getName()).log(Level.SEVERE, null, ex);
        }

        EstadoPaciente estadoPaciente = obterEstadoPaciente(request.getParameter("estado_paciente"));
        SituacaoAtendimento situacaoAtendimento = obterSituacaoAtendimento(request.getParameter("situacao"));

        Agendamento agendamento = new Agendamento();
        agendamento.setId(id);
        agendamento.setAnamnese(anamnese);
        agendamento.setPaciente(paciente);
        agendamento.setAtendente(atendente);
        agendamento.setDataAgendamento(dataAgendamento);
        agendamento.setEstadoPaciente(estadoPaciente);
        agendamento.setSituacao(situacaoAtendimento);

        AgendamentoDao agendamentoDao = new AgendamentoDaoImpl();
        agendamentoDao.update(agendamento);

        listarAgendamentoAction();
    }

    private void buscarAgendamentoAction() throws ServletException, IOException {
        long id = Long.parseLong(request.getParameter("id"));
        AgendamentoDao agendamentoDao = new AgendamentoDaoImpl();
        Agendamento agendamento = agendamentoDao.find(id);
        if (agendamento != null) {
            request.setAttribute("pacienteSelecionado", agendamento.getPaciente().getId());
            List<Paciente> pacientes = listarPacientes();
            request.setAttribute("pacientes", pacientes);
            request.setAttribute("agendamento", agendamento);
            dispatchTo("/AlterarAgendamento.jsp");
        }
    }

    private void buscarAgendamentoPorPacienteAction() throws IOException, ServletException {
        Long idPaciente = Long.parseLong(request.getParameter("paciente"));
        AgendamentoDao dao = new AgendamentoDaoImpl();
        List<Agendamento> agendamentos = dao.findPorPaciente(idPaciente);
        request.setAttribute("agendamentos", agendamentos);

    }

    private void buscarAgendamentoPorDataAction() throws IOException, ServletException {
        String dataInicial = request.getParameter("datainicial");
        String dataFinal = request.getParameter("datafinal");
        if ("".equals(dataInicial) || "".equals(dataFinal)) {
            consultarAgendamentoAction();
        }
        AgendamentoDao dao = new AgendamentoDaoImpl();
        List<Agendamento> agendamentos = dao.findPorData(dataInicial, dataFinal);
        request.setAttribute("agendamentos", agendamentos);
        consultarAgendamentoAction();
    }

    private void consultarAgendamentoAction() throws IOException, ServletException {
        request.setAttribute("pacientes", listarPacientes());
        dispatchTo("/ConsultarAgendamento.jsp");
    }

    private void removerAgendamentoAction() throws IOException, ServletException {
        long id = Long.parseLong(request.getParameter("id"));
        AgendamentoDao agendamentoDao = new AgendamentoDaoImpl();
        Agendamento agendamento = new Agendamento();
        agendamento.setId(id);
        agendamentoDao.delete(agendamento);

        listarAgendamentoAction();
    }

    private void inserirAtendenteAction() throws IOException, ServletException {

        String nome = request.getParameter("nome");
        String cpf = request.getParameter("cpf");
        String telefone = request.getParameter("telefone");
        String endereco = request.getParameter("enderecocompleto");
        String email = request.getParameter("emaillogin");
        String senha = request.getParameter("senha");

        Atendente atendente = new Atendente();
        atendente.setNome(nome);
        atendente.setCpf(cpf);
        atendente.setTelefone(telefone);
        atendente.setEndereco(endereco);
        atendente.setEmail(email);
        atendente.setSenha(MD5.getMD5(senha));

        AtendenteDao atendenteDao = new AtendenteDaoImpl();
        atendenteDao.save(atendente);

        if (atendente.getId() == null) {
            //Vai recarregar a mesma página. Faz um JSTL de um IF e verifica se é para escrever ERRO em vermelho.
            request.setAttribute("erro", "1");
            dispatchTo("/InserirAtendente.jsp");
        } else {
            request.setAttribute("atendentes", listarAtendentes());
            dispatchTo("/ListarAtendente.jsp");
        }
    }

    private void alterarAtendenteAction() throws ServletException, IOException {
        Long id = Long.parseLong(request.getParameter("idatendente"));
        String nome = request.getParameter("nome");
        String cpf = request.getParameter("cpf");
        String telefone = request.getParameter("telefone");
        String endereco = request.getParameter("enderecocompleto");
        String email = request.getParameter("emaillogin");
        String senha = request.getParameter("senha");

        Atendente atendente = new Atendente();
        atendente.setId(id);
        atendente.setNome(nome);
        atendente.setCpf(cpf);
        atendente.setTelefone(telefone);
        atendente.setEndereco(endereco);
        atendente.setEmail(email);
        atendente.setSenha(MD5.getMD5(senha));

        AtendenteDao dao = new AtendenteDaoImpl();
        dao.update(atendente);

        //Action de listar 
        listarAtendenteAction();
    }

    private void listarAtendenteAction() throws ServletException, IOException {
        List<Atendente> atendentes = listarAtendentes();
        request.setAttribute("atendentes", atendentes);
        dispatchTo("/ListarAtendente.jsp");
    }

    private void buscarAtendenteAction() throws ServletException, IOException {
        long id = Long.parseLong(request.getParameter("id"));
        AtendenteDao atendenteDao = new AtendenteDaoImpl();
        Atendente atendente = atendenteDao.find(id);
        if (atendente != null) {
            request.setAttribute("atendente", atendente);
            dispatchTo("/AlterarAtendente.jsp");
        }
    }

    private void buscarAtendentePorNomeAction() throws ServletException, IOException {
        String nome = request.getParameter("nomeatendente");
        AtendenteDao dao = new AtendenteDaoImpl();
        List<Atendente> atendentes = dao.findPorNome(nome);
        request.setAttribute("atendentes", atendentes);
        dispatchTo("/BuscarAtendente.jsp");
    }

    private void buscarAtendentePorCpfAction() throws ServletException, IOException {
        String cpf = request.getParameter("cpfatendente");
        AtendenteDao dao = new AtendenteDaoImpl();
        List<Atendente> atendentes = dao.findPorCpf(cpf);
        request.setAttribute("atendentes", atendentes);
        dispatchTo("/BuscarAtendente.jsp");
    }

    private List<Atendente> listarAtendentes() {
        AtendenteDao dao = new AtendenteDaoImpl();
        List<Atendente> atendentes = dao.findAll();
        return atendentes;
    }

    private void removerAtendenteAction() throws ServletException, IOException {
        long id = Long.parseLong(request.getParameter("id"));
        AtendenteDao atendenteDao = new AtendenteDaoImpl();
        Atendente atendente = new Atendente();
        atendente.setId(id);
        atendenteDao.delete(atendente);

        listarAtendenteAction();
    }

    private void inserirMedicoAction() throws IOException, ServletException {
        String nome = request.getParameter("nome");
        String cpf = request.getParameter("cpf");
        String crm = request.getParameter("crm");
        String especialidade = request.getParameter("especialidade");
        String telefone = request.getParameter("telefone");
        String endereco = request.getParameter("enderecocompleto");
        String email = request.getParameter("emaillogin");
        String senha = request.getParameter("senha");

        Medico medico = new Medico();
        medico.setNome(nome);
        medico.setCpf(cpf);
        medico.setCrm(crm);
        medico.setEspecialidade(especialidade);
        medico.setTelefone(telefone);
        medico.setEndereco(endereco);
        medico.setEmail(email);
        medico.setSenha(MD5.getMD5(senha));

        MedicoDao medicoDao = new MedicoDaoImpl();
        medicoDao.save(medico);

        if (medico.getId() == null) {
            //Vai recarregar a mesma página. Faz um JSTL de um IF e verifica se é para escrever ERRO em vermelho.
            request.setAttribute("erro", "1");
            dispatchTo("/InserirMedico.jsp");
        } else {
            request.setAttribute("medicos", listarMedicos());
            dispatchTo("/ListarMedico.jsp");
        }
    }

    private void alterarMedicoAction() throws ServletException, IOException {
        Long id = Long.parseLong(request.getParameter("idmedico"));
        String nome = request.getParameter("nome");
        String cpf = request.getParameter("cpf");
        String crm = request.getParameter("crm");
        String especialidade = request.getParameter("especialidade");
        String telefone = request.getParameter("telefone");
        String endereco = request.getParameter("enderecocompleto");
        String email = request.getParameter("emaillogin");
        String senha = request.getParameter("senha");

        Medico medico = new Medico();
        medico.setId(id);
        medico.setNome(nome);
        medico.setCpf(cpf);
        medico.setCrm(crm);
        medico.setEspecialidade(especialidade);
        medico.setTelefone(telefone);
        medico.setEndereco(endereco);
        medico.setEmail(email);
        medico.setSenha(MD5.getMD5(senha));

        MedicoDao medicoDao = new MedicoDaoImpl();
        medicoDao.update(medico);

        //Action de listar 
        listarMedicoAction();
    }

    private void listarMedicoAction() throws ServletException, IOException {
        List<Medico> medicos = listarMedicos();
        request.setAttribute("medicos", medicos);
        dispatchTo("/ListarMedico.jsp");
    }

    private void buscarMedicoAction() throws ServletException, IOException {
        long id = Long.parseLong(request.getParameter("id"));
        MedicoDao medicoDao = new MedicoDaoImpl();
        Medico medico = medicoDao.find(id);
        if (medico != null) {
            request.setAttribute("medico", medico);
            dispatchTo("/AlterarMedico.jsp");
        }
    }

    private void buscarMedicoPorEspAction() throws ServletException, IOException {
        String especialidade = request.getParameter("especialidade");
        MedicoDao dao = new MedicoDaoImpl();
        List<Medico> medicos = dao.findPorEsp(especialidade);
        request.setAttribute("medicos", medicos);
        dispatchTo("/BuscarMedico.jsp");
    }

    private void buscarMedicoPorCrmAction() throws ServletException, IOException {
        String crm = request.getParameter("crmmedico");
        MedicoDao dao = new MedicoDaoImpl();
        List<Medico> medicos = dao.findPorCrm(crm);
        request.setAttribute("medicos", medicos);
        dispatchTo("/BuscarMedico.jsp");
    }

    private void removerMedicoAction() throws ServletException, IOException {
        long id = Long.parseLong(request.getParameter("id"));
        MedicoDao medicoDao = new MedicoDaoImpl();
        Medico medico = new Medico();
        medico.setId(id);
        medicoDao.delete(medico);

        listarMedicoAction();
    }

    private List<Medico> listarMedicos() {
        MedicoDao dao = new MedicoDaoImpl();
        List<Medico> medicos = dao.findAll();
        return medicos;
    }

    private void inserirPacienteAction() throws ServletException, IOException {

        String nome = request.getParameter("nome");
        if (nome == null) {
            PlanoSaudeDao planoDao = new PlanoSaudeDaoImpl();
            List<PlanoSaude> planos = planoDao.findAll();
            request.setAttribute("planos", planos);
            dispatchTo("/InserirPaciente.jsp");
            return;
        }

        String cpf = request.getParameter("cpf");
        String endereco = request.getParameter("enderecocompleto");
        String email = request.getParameter("email");
        String telefone = request.getParameter("telefone");
        Long idPlano = Long.parseLong(request.getParameter("plano"));
        Integer numero = Integer.parseInt(request.getParameter("numero"));
        String tipo = request.getParameter("tipo");

        Paciente paciente = new Paciente();
        paciente.setNome(nome);
        paciente.setCpf(cpf);
        paciente.setEndereco(endereco);
        paciente.setEmail(email);
        paciente.setTelefone(telefone);

        PlanoSaude planoSaude = new PlanoSaude();
        planoSaude.setId(idPlano);
        //PlanoSaudeDao planoSaudeDao = new PlanoSaudeDaoImpl();
        //PlanoSaude planoSaude = planoSaudeDao.find(idPlano);

        PacienteDao pacienteDao = new PacienteDaoImpl();
        pacienteDao.save(paciente);

        PacientePlano pacientePlano = new PacientePlano();
        pacientePlano.setPlanoSaude(planoSaude);
        pacientePlano.setNumero(numero);
        pacientePlano.setTipo(tipo);
        pacientePlano.setPaciente(paciente);

        paciente.setPacientePlano(pacientePlano);

        PacientePlanoDao pacientePlanoDao = new PacientePlanoDaoImpl();
        pacientePlanoDao.save(pacientePlano);

        listarPacienteAction();
    }

    private void alterarPacienteAction() throws IOException, ServletException {
        Long id = Long.parseLong(request.getParameter("idpaciente"));
        String nome = request.getParameter("nome");
        String cpf = request.getParameter("cpf");
        String endereco = request.getParameter("enderecocompleto");
        String email = request.getParameter("email");
        String telefone = request.getParameter("telefone");

        Long idPlano = Long.parseLong(request.getParameter("plano"));
        Integer numero = Integer.parseInt(request.getParameter("numero"));
        String tipo = request.getParameter("tipo");

        Paciente paciente = new Paciente();
        paciente.setId(id);
        paciente.setNome(nome);
        paciente.setCpf(cpf);
        paciente.setEndereco(endereco);
        paciente.setEmail(email);
        paciente.setTelefone(telefone);

        PlanoSaude planoSaude = new PlanoSaude();
        planoSaude.setId(idPlano);
        //PlanoSaudeDao planoSaudeDao = new PlanoSaudeDaoImpl();
        //PlanoSaude planoSaude = planoSaudeDao.find(idPlano);

        PacienteDao pacienteDao = new PacienteDaoImpl();
        pacienteDao.update(paciente);

        PacientePlano pacientePlano = new PacientePlano();
        Long idPacientePlano = Long.parseLong(request.getParameter("idpacienteplano"));
        pacientePlano.setId(idPacientePlano);
        pacientePlano.setPlanoSaude(planoSaude);
        pacientePlano.setNumero(numero);
        pacientePlano.setTipo(tipo);
        pacientePlano.setPaciente(paciente);

        paciente.setPacientePlano(pacientePlano);

        PacientePlanoDao pacientePlanoDao = new PacientePlanoDaoImpl();
        pacientePlanoDao.update(pacientePlano);

        listarPacienteAction();
    }

    private void listarPacienteAction() throws ServletException, IOException {
        List<Paciente> pacientes = listarPacientes();
        request.setAttribute("pacientes", pacientes);
        dispatchTo("/ListarPaciente.jsp");
    }

    private List<Paciente> listarPacientes() {
        PacienteDao dao = new PacienteDaoImpl();
        List<Paciente> pacientes = dao.findAll();
        return pacientes;
    }

    private void buscarPacienteAction() throws ServletException, IOException {
        long id = Long.parseLong(request.getParameter("id"));
        PacienteDao pacienteDao = new PacienteDaoImpl();
        Paciente paciente = pacienteDao.find(id);
        PacientePlano pacientePlano = paciente.getPacientePlano();
        if (paciente != null) {
            request.setAttribute("paciente", paciente);
            request.setAttribute("planoSelecionado", pacientePlano.getId());
            PlanoSaudeDao planoDao = new PlanoSaudeDaoImpl();
            List<PlanoSaude> planos = planoDao.findAll();
            request.setAttribute("planos", planos);
            dispatchTo("/AlterarPaciente.jsp");
        }
    }

    private void buscarPacientePorNomeAction() throws ServletException, IOException {
        String nome = request.getParameter("nome_paciente");
        PacienteDao dao = new PacienteDaoImpl();
        List<Paciente> pacientes = dao.findPorNome(nome);
        request.setAttribute("pacientes", pacientes);
        dispatchTo("/BuscarPaciente.jsp");
    }

    private void buscarPacientePorCpfAction() throws ServletException, IOException {
        String cpf = request.getParameter("cpf_paciente");
        PacienteDao dao = new PacienteDaoImpl();
        List<Paciente> pacientes = dao.findPorCpf(cpf);
        request.setAttribute("pacientes", pacientes);
        dispatchTo("/BuscarPaciente.jsp");
    }

    private void removerPacienteAction() throws ServletException, IOException {
        Long id = Long.parseLong(request.getParameter("id"));
        Long idPacientePlano = Long.parseLong(request.getParameter("idpp"));

        PacientePlanoDao pacientePlanoDao = new PacientePlanoDaoImpl();
        PacientePlano pacientePlano = new PacientePlano();
        pacientePlano.setId(idPacientePlano);
        pacientePlanoDao.delete(pacientePlano);

        PacienteDao pacienteDao = new PacienteDaoImpl();
        Paciente paciente = new Paciente();
        paciente.setId(id);
        pacienteDao.delete(paciente);

        listarPacienteAction();
    }

    private void inserirPlanoAction() throws IOException, ServletException {
        String nome = request.getParameter("nome");
        String cnpj = request.getParameter("cnpj");
        String endereco = request.getParameter("enderecocompleto");
        String telefone = request.getParameter("telefone");
        String contato = request.getParameter("contato");
        String email = request.getParameter("email");

        PlanoSaude plano = new PlanoSaude();
        plano.setNome(nome);
        plano.setCnpj(cnpj);
        plano.setEndereco(endereco);
        plano.setTelefone(telefone);
        plano.setContato(contato);
        plano.setEmail(email);

        PlanoSaudeDao planoDao = new PlanoSaudeDaoImpl();
        planoDao.save(plano);

        if (plano.getId() == null) {
            //Vai recarregar a mesma página. Faz um JSTL de um IF e verifica se é para escrever ERRO em vermelho.
            request.setAttribute("erro", "1");
            dispatchTo("/InserirPlano.jsp");
        } else {
            request.setAttribute("planos", listarPlanos());
            dispatchTo("/ListarPlano.jsp");
        }
    }

    private void alterarPlanoAction() throws ServletException, IOException {
        Long id = Long.parseLong(request.getParameter("idplano"));
        String nome = request.getParameter("nome");
        String cnpj = request.getParameter("cnpj");
        String endereco = request.getParameter("enderecocompleto");
        String telefone = request.getParameter("telefone");
        String contato = request.getParameter("contato");
        String email = request.getParameter("email");

        PlanoSaude plano = new PlanoSaude();
        plano.setId(id);
        plano.setNome(nome);
        plano.setCnpj(cnpj);
        plano.setEndereco(endereco);
        plano.setTelefone(telefone);
        plano.setContato(contato);
        plano.setEmail(email);

        PlanoSaudeDao planoDao = new PlanoSaudeDaoImpl();
        planoDao.update(plano);

        //Action de listar 
        listarPlanoAction();
    }

    private void listarPlanoAction() throws ServletException, IOException {
        List<PlanoSaude> planos = listarPlanos();
        request.setAttribute("planos", planos);
        dispatchTo("/ListarPlano.jsp");
    }

    private List<PlanoSaude> listarPlanos() {
        PlanoSaudeDao dao = new PlanoSaudeDaoImpl();
        List<PlanoSaude> planos = dao.findAll();
        return planos;
    }

    private void buscarPlanoAction() throws ServletException, IOException {
        long id = Long.parseLong(request.getParameter("id"));
        PlanoSaudeDao planoDao = new PlanoSaudeDaoImpl();
        PlanoSaude plano = planoDao.find(id);
        if (plano != null) {
            request.setAttribute("planosaude", plano);
            dispatchTo("/AlterarPlano.jsp");
        }
    }

    private void buscarPlanoPorCnpj() throws ServletException, IOException {
        String cnpj = request.getParameter("cnpjplano");
        PlanoSaudeDao dao = new PlanoSaudeDaoImpl();
        List<PlanoSaude> planoSaude = dao.findPorCnpj(cnpj);
        request.setAttribute("planos", planoSaude);
        dispatchTo("/BuscarPlano.jsp");

    }

    private void removerPlanoAction() throws ServletException, IOException {
        long id = Long.parseLong(request.getParameter("id"));
        PlanoSaudeDao planoDao = new PlanoSaudeDaoImpl();
        PlanoSaude plano = new PlanoSaude();
        plano.setId(id);
        planoDao.delete(plano);

        listarPlanoAction();
    }

    private void atenderProximoPacienteAction() throws ServletException, IOException {
        AgendamentoDao agendamentoDao = new AgendamentoDaoImpl();
        List<Agendamento> agendamentos = agendamentoDao.findPorSituacao(SituacaoAtendimento.ESPERA);
        List<Agendamento> agendamentosMaisCriticos = filtrarEstadoMaisCritico(agendamentos);
        Agendamento proximoAgendamento = filtrarMaiorTempoEspera(agendamentosMaisCriticos);

        if (proximoAgendamento == null) {
            request.setAttribute("erro", 1);
            dispatchTo("/InicioMedico.jsp");
        } else {
            request.setAttribute("agendamento", proximoAgendamento);
            request.setAttribute("atendimentos", buscarAtendimentosPorPaciente(proximoAgendamento.getPaciente()));
            request.setAttribute("datahora", new Date());
            alterarSituacaoAgendamento(proximoAgendamento, SituacaoAtendimento.EM_ATENDIMENTO);
            dispatchTo("/AtenderPaciente.jsp");
        }
    }

    private List<Agendamento> filtrarEstadoMaisCritico(List<Agendamento> agendamentos) {
        List<Agendamento> agendamentosRiscoVida = new ArrayList<Agendamento>();
        List<Agendamento> agendamentosCritico = new ArrayList<Agendamento>();
        List<Agendamento> agendamentosEstavel = new ArrayList<Agendamento>();
        for (Agendamento agendamento : agendamentos) {
            switch (agendamento.getEstadoPaciente()) {
                case ESTAVEL:
                    agendamentosEstavel.add(agendamento);
                    break;
                case CRITICO:
                    agendamentosCritico.add(agendamento);
                    break;
                case RISCO_VIDA:
                    agendamentosRiscoVida.add(agendamento);
                    break;
            }
        }
        if (agendamentosRiscoVida.size() != 0) {
            return agendamentosRiscoVida;
        } else if (agendamentosCritico.size() != 0) {
            return agendamentosCritico;
        } else {
            return agendamentosEstavel;
        }
    }

    private Agendamento filtrarMaiorTempoEspera(List<Agendamento> agendamentos) {
        if (agendamentos.size() == 0) {
            return null;
        }

        Agendamento agendamentoMaiorTempoEspera = agendamentos.get(0);
        for (int i = 1; i < agendamentos.size(); i++) {
            Agendamento agendamento = agendamentos.get(i);
            if (agendamentoMaiorTempoEspera.getDataAgendamento().after(agendamento.getDataAgendamento())) {
                agendamentoMaiorTempoEspera = agendamento;
            }
        }
        return agendamentoMaiorTempoEspera;
    }

    private void alterarSituacaoAgendamento(Agendamento agendamento, SituacaoAtendimento novaSituacao) {
        AgendamentoDao agendamentoDao = new AgendamentoDaoImpl();
        agendamento.setSituacao(novaSituacao);
        agendamentoDao.update(agendamento);
    }

    private List<Atendimento> buscarAtendimentosPorPaciente(Paciente paciente) {
        AtendimentoDao atendimentoDao = new AtendimentoDaoImpl();
        List<Atendimento> atendimentos = atendimentoDao.findPorPaciente(paciente);
        return atendimentos;
    }

    private void finalizarAtendimentoAction() throws ServletException, IOException {
        if (request.getParameter("salvar") != null) {
            salvarAtendimento();
        } else {
            cancelarAtendimento();
        }
    }

    private void salvarAtendimento() throws ServletException, IOException {
        Long idAgendamento = Long.parseLong(request.getParameter("idagendamento"));
        AgendamentoDao agendamentoDao = new AgendamentoDaoImpl();
        Agendamento agendamento = agendamentoDao.find(idAgendamento);
        Date dataAtendimento = new Date();

        Medico medico = (Medico) request.getSession().getAttribute("usuario");
        String diagnostico = request.getParameter("diagnostico");
        String receita = request.getParameter("receita");

        Atendimento atendimento = new Atendimento();
        atendimento.setDataAtendimento(dataAtendimento);
        atendimento.setMedico(medico);
        atendimento.setDiagnostico(diagnostico);
        atendimento.setReceita(receita);
        atendimento.setPaciente(agendamento.getPaciente());

        AtendimentoDao atendimentoDao = new AtendimentoDaoImpl();
        atendimentoDao.save(atendimento);

        agendamento.setAtendimento(atendimento);
        agendamento.setSituacao(SituacaoAtendimento.ATENDIDO);

        Agendamento ag = agendamento.clone();

        AgendamentoDao agendamentoDao2 = new AgendamentoDaoImpl();
        agendamentoDao2.update(ag);

        dispatchTo("/InicioMedico.jsp");
    }

    private void cancelarAtendimento() throws ServletException, IOException {
        Long idAgendamento = Long.parseLong(request.getParameter("idagendamento"));
        AgendamentoDao agendamentoDao = new AgendamentoDaoImpl();
        Agendamento agendamento = agendamentoDao.find(idAgendamento);
        Agendamento ag = agendamento.clone();
        ag.setSituacao(SituacaoAtendimento.CANCELADO);
        agendamentoDao.update(ag);
        dispatchTo("/InicioMedico.jsp");
    }

    private void atualizarPainelAction() throws ServletException, IOException {
        AgendamentoDao agendamentoDao = new AgendamentoDaoImpl();
        List<Agendamento> agendamentos = agendamentoDao.findPorSituacao(SituacaoAtendimento.ESPERA);
        List<Agendamento> agendamentosEmAtendimento = agendamentoDao.findPorSituacao(SituacaoAtendimento.EM_ATENDIMENTO);
        if (agendamentosEmAtendimento.size() > 0) {
            request.setAttribute("senha", agendamentosEmAtendimento.get(0).getId());
        } else {
            request.setAttribute("senha", "Aguarde...");
        }
        request.setAttribute("agendamentos", agendamentos);

        dispatchTo("/Painel.jsp");
    }

}
